package utils
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	
	/**
	 * 弹出顶级窗口 
	 * @author muye
	 * 
	 */
	public class PopUpManagerAS
	{
		private static var _popUpManager:PopUpManagerAS;
		/**
		 * 舞台 
		 */
		private var _stageRoot:DisplayObjectContainer;
		/**
		 * 孩子HasMap {window:DisplayObject, modal:Boolean}
		 */
		private var _childHasMap:HashMap;
		
		/**
		 * 窗口为模态窗口时使用的样式 
		 */
		private var _fileteSprite:Sprite;
		
		/**
		 * 窗口为模态窗口时是否使用样式 
		 */
		private var _isUserSty:Boolean=true;
		public function PopUpManagerAS(){
			addValue();
		}
		
		/**
		 * 弹出窗口单例 
		 * @return PopUpManager
		 * 
		 */
		public static function instance():PopUpManagerAS{
			if(_popUpManager==null){
				_popUpManager=new PopUpManagerAS();
			}
			return _popUpManager;
		}
		
		/**
		 * 弹出一个顶级窗口 
		 * @param window 要弹出的显示对象 
		 * @param parent 需要弹出对象的相对组件
		 * @param modal 如果为 true，则该窗口为模态窗口，也就是说在删除该窗口之前，用户将无法与其它弹出窗口交互。
		 * 
		 */
		public function addPopUp(window:DisplayObject, parent:DisplayObject, modal:Boolean = false):void{
			if(window&&_stageRoot){
				//设置位置
				window.x=parent.x+30;
				window.y=parent.y+30;
				if(modal==true){
					setModalSty(modal,_stageRoot.numChildren-1);
				}else{
					checkHasMapModal();
				}
				_stageRoot.addChild(window);
				_childHasMap.put(window,modal);
			}
		}
		
		/**
		 * 使用 模态窗口 样式
		 * @param modal 是否为模态窗口
		 * @param index 作用的层次
		 * 
		 */
		private function setModalSty(modal:Boolean,index:int=0):void{
			if(modal){
				_fileteSprite.graphics.clear();
				if(_isUserSty){
					_fileteSprite.graphics.beginFill(0xFFFFFF,0.4);        
				}else{
					_fileteSprite.graphics.beginFill(0xFFFFFF,0);
				}
				_fileteSprite.graphics.drawRect(0,0,_stageRoot.width,_stageRoot.height);
				_fileteSprite.graphics.endFill();
				_stageRoot.addChildAt(_fileteSprite,index);
				_fileteSprite.visible=true;
			}else{
				_stageRoot.addChildAt(_fileteSprite,index);
				_fileteSprite.visible=false;
			}
		}
		
		/**
		 * 使位于调用 createPopUp() 或 addPopUp() 方法期间使用的任何窗口上面的弹出窗口居中显示。 
		 * @param popUp 需要居中显示的对象
		 * 
		 */
		public function centerPopUp(popUp:DisplayObject):void{
			if(popUp){
				popUp.x=(_stageRoot.width-popUp.width)/2;
				popUp.y=(_stageRoot.height-popUp.height)/2;
			}
		}
		
		/**
		 * 创建一个顶级窗口 
		 * @param parent  需要弹出对象的相对组件
		 * @param className 类名
		 * @param modal 如果为 true，则该窗口为模态窗口，也就是说在删除该窗口之前，用户将无法与其它弹出窗口交互。
		 * @return DisplayObject
		 * 
		 */
		public function createPopUp(parent:DisplayObject, className:Class, modal:Boolean = false):DisplayObject{
			var window:DisplayObject=new className();
			addPopUp(window,parent,modal);
			return window;
		}
		
		/**
		 * 删除由 createPopUp() 或 addPopUp() 方法弹出的弹出窗口。 
		 * @param popUp 需要移除的显示对象
		 * 
		 */
		public function removePopUp(popUp:DisplayObject):void{
			if(popUp&&_stageRoot){
				if(_stageRoot.contains(popUp)){
					_childHasMap.remove(popUp);
					_stageRoot.removeChild(popUp);
					checkHasMapModal();
				}
			}
		}
		
		/**
		 * 关闭所有由 createPopUp() 或 addPopUp() 方法弹出的弹出窗口
		 * 
		 */
		public function removeAllPopView():void{
			if(_stageRoot){
				var keys:Array=_childHasMap.keys();
				for(var i:int=keys.length-1;i>=0;i--){
					var window:DisplayObject=keys[i] as DisplayObject;
					if(_stageRoot.contains(window)){
						_stageRoot.removeChild(window);
					}
				}
				_childHasMap.clear();
				setModalSty(false);
			}
		}
		
		/**
		 * 检查 createPopUp() 或 addPopUp() 方法弹出的弹出窗口中是否存在使用了窗口为模态窗口的对象
		 * 
		 */
		private function checkHasMapModal():void{
			var keys:Array=_childHasMap.keys();
			var index:int=keys.length-1;
			
			var nowMaxLec:int=0;
			setModalSty(false);
			while(index>=0){
				var window:DisplayObject=keys[index] as DisplayObject;
				if(_stageRoot.contains(window)){
					var inds:int=_stageRoot.getChildIndex(_fileteSprite);
					var lec:int=_stageRoot.getChildIndex(window);
					if(_childHasMap.getValue(window)==true){
						if(lec>inds){
							if(lec>=_stageRoot.numChildren-1){
								setModalSty(true,_stageRoot.numChildren-2);
							}else{
								setModalSty(true,lec-1);
							}
						}        
					}
				}
				index--;
			}
		}
		
		
		/**
		 * 增加变量 
		 * 
		 */
		private function addValue():void{
			_childHasMap=new HashMap();
		}
		
		/**
		 * 移除变量 
		 * 
		 */
		private function removeValue():void{
			
		}
		
		/**
		 * 增加监听 
		 * 
		 */
		private function addListener():void{
			
		}
		
		/**
		 * 移除监听 
		 * 
		 */
		private function removeListener():void{
			
		}
		
		/**
		 * 舞台 
		 */
		public function get stageRoot():DisplayObjectContainer{
			return _stageRoot;
		}
		
		public function set stageRoot(value:DisplayObjectContainer):void{
			_stageRoot = value;
			_fileteSprite=new Sprite();
			_stageRoot.addChild(_fileteSprite);
			_fileteSprite.visible=false;
		}
		
		/**
		 * 窗口为模态窗口时是否使用样式
		 */
		public function get isUserSty():Boolean{
			return _isUserSty;
		}
		
		public function set isUserSty(value:Boolean):void{
			_isUserSty = value;
		}
	}
}